// main.js

// 导入 Vue 3
import { createApp } from 'vue'

// 导入应用根组件
import App from './App.vue'

// ==================== 导入第三方库和插件 ====================

// 导入 uView Plus UI 组件库
import uView from 'uview-plus'

// 导入国际化 i18n 配置
import i18n from '@/i18n'

// 导入自定义过滤器/工具函数
import { installFilters } from '@/utils/filters'

// 导入状态管理 (Pinia)
import { createPinia } from 'pinia'
const pinia = createPinia()

// 导入路由拦截器 (可选)
import '@/router/interceptor'

// 导入全局指令
import '@/directives'

// 导入全局组件
import GlobalComponents from '@/components/global'

// ==================== 创建应用实例 ====================

// 创建 Vue 应用实例
const app = createApp(App)

// ==================== 配置应用 ====================

// 设置应用生产提示
app.config.productionTip = false

// 设置应用错误处理器
app.config.errorHandler = (err, vm, info) => {
  console.error('全局错误捕获:', err)
  console.log('发生错误的组件:', vm)
  console.log('错误信息:', info)
  
  // 可以在这里统一处理错误，比如上报到监控平台
  uni.reportMonitor('JS_ERROR', {
    error: err.message,
    component: vm?.$options?.name,
    info: info
  })
}

// 设置应用警告处理器
app.config.warnHandler = (msg, vm, trace) => {
  console.warn('全局警告:', msg)
  console.log('警告组件:', vm)
  console.log('堆栈跟踪:', trace)
}

// ==================== 安装插件 ====================

// 安装 uView Plus
app.use(uView)

// 安装国际化 i18n
app.use(i18n)

// 安装状态管理 Pinia
app.use(pinia)

// 安装自定义过滤器
installFilters(app)

// 安装全局组件
app.use(GlobalComponents)

// ==================== 注册全局属性 ====================

// 注册全局属性 - 版本号
app.config.globalProperties.$version = '1.0.0'

// 注册全局属性 - 环境变量
app.config.globalProperties.$env = {
  isDevelopment: process.env.NODE_ENV === 'development',
  isProduction: process.env.NODE_ENV === 'production',
  appId: '__UNI__XXXXXX'
}

// 注册全局属性 - 工具函数
app.config.globalProperties.$utils = {
  // 防抖函数
  debounce(func, wait) {
    let timeout
    return function executedFunction(...args) {
      const later = () => {
        clearTimeout(timeout)
        func(...args)
      }
      clearTimeout(timeout)
      timeout = setTimeout(later, wait)
    }
  },
  
  // 节流函数
  throttle(func, wait) {
    let timeout
    return function executedFunction(...args) {
      if (!timeout) {
        func(...args)
        timeout = setTimeout(() => {
          timeout = null
        }, wait)
      }
    }
  },
  
  // 深度克隆
  deepClone(obj) {
    return JSON.parse(JSON.stringify(obj))
  },
  
  // 格式化日期
  formatDate(date, format = 'YYYY-MM-DD') {
    const d = new Date(date)
    const year = d.getFullYear()
    const month = String(d.getMonth() + 1).padStart(2, '0')
    const day = String(d.getDate()).padStart(2, '0')
    
    return format
      .replace('YYYY', year)
      .replace('MM', month)
      .replace('DD', day)
  }
}

// ==================== 注册全局方法 ====================

// 全局显示加载框
app.config.globalProperties.$showLoading = (title = '加载中') => {
  uni.showLoading({
    title: title,
    mask: true
  })
}

// 全局隐藏加载框
app.config.globalProperties.$hideLoading = () => {
  uni.hideLoading()
}

// 全局显示提示
app.config.globalProperties.$toast = (title, icon = 'none') => {
  uni.showToast({
    title: title,
    icon: icon,
    duration: 2000
  })
}

// 全局显示模态框
app.config.globalProperties.$showModal = (options) => {
  return new Promise((resolve, reject) => {
    uni.showModal({
      title: '提示',
      confirmColor: '#007AFF',
      ...options,
      success: (res) => {
        if (res.confirm) {
          resolve(true)
        } else if (res.cancel) {
          resolve(false)
        }
      },
      fail: (err) => {
        reject(err)
      }
    })
  })
}

// ==================== 全局混入 ====================

// 全局混入 - 页面生命周期
app.mixin({
  onLoad() {
    console.log('页面加载:', this.$route)
    
    // 页面加载统计
    if (this.$env.isProduction) {
      uni.reportAnalytics('page_view', {
        page_path: this.$route.path,
        page_name: this.$options.name || '未知页面'
      })
    }
  },
  
  onShow() {
    console.log('页面显示:', this.$route)
  },
  
  onHide() {
    console.log('页面隐藏:', this.$route)
  },
  
  onUnload() {
    console.log('页面卸载:', this.$route)
  },
  
  methods: {
    // 全局页面跳转方法
    $navigateTo(url, options = {}) {
      uni.navigateTo({
        url: url,
        ...options
      })
    },
    
    // 全局重定向方法
    $redirectTo(url, options = {}) {
      uni.redirectTo({
        url: url,
        ...options
      })
    },
    
    // 全局返回方法
    $navigateBack(delta = 1) {
      uni.navigateBack({
        delta: delta
      })
    },
    
    // 全局切换Tab方法
    $switchTab(url) {
      uni.switchTab({
        url: url
      })
    }
  }
})

// ==================== 应用启动前处理 ====================

// 应用启动前的预处理
const beforeAppMount = async () => {
  try {
    // 显示加载状态
    uni.showLoading({ title: '加载中', mask: true })
    
    // 初始化系统信息
    const systemInfo = uni.getSystemInfoSync()
    app.config.globalProperties.$systemInfo = systemInfo
    
    // 初始化用户信息（从缓存中读取）
    try {
      const userInfo = uni.getStorageSync('userInfo')
      if (userInfo) {
        app.config.globalProperties.$userInfo = userInfo
      }
    } catch (e) {
      console.warn('读取用户信息失败:', e)
    }
    
    // 检查更新（生产环境）
    if (process.env.NODE_ENV === 'production') {
      const updateManager = uni.getUpdateManager()
      updateManager.onCheckForUpdate(function (res) {
        if (res.hasUpdate) {
          console.log('发现新版本')
        }
      })
    }
    
    // 模拟异步初始化
    await new Promise(resolve => setTimeout(resolve, 500))
    
  } catch (error) {
    console.error('应用启动前初始化失败:', error)
  } finally {
    // 隐藏加载状态
    uni.hideLoading()
  }
}

// ==================== 挂载应用 ====================

// 应用挂载
const mountApp = async () => {
  try {
    // 执行启动前处理
    await beforeAppMount()
    
    // 挂载应用到 #app
    app.mount('#app')
    
    console.log('🚀 应用启动成功')
    
    // 应用启动完成事件
    uni.$emit('app-mounted')
    
  } catch (error) {
    console.error('应用挂载失败:', error)
    
    // 显示错误页面或提示
    uni.showModal({
      title: '应用启动失败',
      content: '请尝试重新打开应用',
      showCancel: false,
      success: () => {
        // 可以在这里做一些恢复操作
      }
    })
  }
}

// 执行挂载
mountApp()

// ==================== 导出应用实例 ====================

// 导出应用实例（用于测试或其他模块使用）
export default app

// ==================== 全局错误监听 ====================

// 监听未处理的 Promise 拒绝
uni.onUnhandledRejection((error) => {
  console.error('未处理的 Promise 拒绝:', error)
  // 可以上报错误到监控平台
})

// 监听全局错误
uni.onError((error) => {
  console.error('全局错误:', error)
  // 可以上报错误到监控平台
})

// ==================== 开发环境配置 ====================

// 开发环境下的调试配置
if (process.env.NODE_ENV === 'development') {
  // 启用 Vue 开发者工具
  if (typeof window !== 'undefined') {
    window.__VUE_DEVTOOLS_GLOBAL_HOOK__ = {
      on: () => {},
      off: () => {},
      emit: () => {}
    }
  }
  
  // 添加调试方法
  app.config.globalProperties.$debug = {
    log: (...args) => console.log('[DEBUG]', ...args),
    info: (...args) => console.info('[DEBUG]', ...args),
    warn: (...args) => console.warn('[DEBUG]', ...args),
    error: (...args) => console.error('[DEBUG]', ...args)
  }
  
  console.log('🔧 开发模式已启用')
}